# 给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串 s ，判断字符串是否有效。 
# 
#  有效字符串需满足： 
# 
#  
#  左括号必须用相同类型的右括号闭合。 
#  左括号必须以正确的顺序闭合。 
#  每个右括号都有一个对应的相同类型的左括号。 
#  
# 
#  
# 
#  示例 1： 
# 
#  
#  输入：s = "()" 
#  
# 
#  输出：true 
# 
#  示例 2： 
# 
#  
#  输入：s = "()[]{}" 
#  
# 
#  输出：true 
# 
#  示例 3： 
# 
#  
#  输入：s = "(]" 
#  
# 
#  输出：false 
# 
#  示例 4： 
# 
#  
#  输入：s = "([])" 
#  
# 
#  输出：true 
# 
#  
# 
#  提示： 
# 
#  
#  1 <= s.length <= 10⁴ 
#  s 仅由括号 '()[]{}' 组成 
#  
# 
#  Related Topics 栈 字符串 👍 4589 👎 0
from collections import defaultdict


# leetcode submit region begin(Prohibit modification and deletion)
class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool

        arr = []
        for item in s:
            arr.append(item)
            if len(arr) >= 2:
                if arr[-2:] == ["(", ")"] or arr[-2:] == ["[", "]"] or arr[-2:] == ["{", "}"]:
                    arr = arr[:-2]
        if arr:
            return False
        else:
            return True
        """
        """
        思路二:用栈来实现
        """

        d = {")": "(",
             "]": "[",
             "}": "{"
             }
        stack = []
        for i in s:
            if stack:
                # 用get是防止没有key值报错
                if d.get(i,0) == stack[-1]:
                    stack.pop()
                else:
                    stack.append(i)
            else:
                stack.append(i)
        return not stack


if __name__ == '__main__':
    print(Solution().isValid('(){}}{'))
# leetcode submit region end(Prohibit modification and deletion)
